package com.rainbow.common.core.error;

/**
 * 通用错误码
 * code错误码
 * message国际化key
 * @author  傅为地
 */
public enum GlobalErrorCode {
    /**
     * 响应成功
     */
    RESPONSE_SUCCESS(200, "response.success"),
    /**
     * 请求成功
     */
    REQUEST_SUCCESS(200, "request.success"),
    /**
     * 操作成功
     */
    OPERATION_SUCCESS(200, "operation.success"),

    /**
     * 成功
     */
    SUCCESS(200, "success"),

    /**
     * 服务器内部异常
     */
    INTERNAL_SERVER_ERROR(500, "internal.server.error"),
    /**
     * 参数校验错误
     */
    PARAMETER_VERIFICATION_ERROR(400, "parameter.verification.error"),

    /**
     * 令牌和客户端不匹配
     */
    TOKEN_UNMATCH_CLIENT(401, "token.unmatch.client"),

    /**
     * 无权访问资源
     */
    UNAUTHORIEZED_ACCESS_RESOURCE(401, "unauthorized.access.resources"),

    /**
     * 用户权限变更,请重新登录
     */
    USER_RIGHTS_CHANGE(401, "user.rights.change"),

    /**
     * 请求令牌为空
     */
    USER_TOKEN_EMPTY(401, "user.token.empty"),

    /**
     * 资源地址为空
     */
    RESOURCES_EMPTY(401, "resources.empty"),

    /**
     * 客户端编码为空
     */
    CLIENT_CODE_EMPTY(401, "client.code.empty"),


    /**
     * 请求令牌无效
     */
    USER_TOKEN_INVALID(401, "user.token.invalid"),

    /**
     * 请求令牌过期
     */
    USER_TOKEN_EXPIRED(401, "user.token.expired");




    /**
     * 错误码
     */
    private Integer code;
    /**
     * 错误消息国际化字段名
     */
    private String message;

    /**
     * 错误消息国际化字段名
     */
    private Object data;

    GlobalErrorCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    GlobalErrorCode(Integer code, String message, String data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer code() {
        return this.code;
    }

    public String message() {
        return this.message;
    }

    public Object data() {
        return this.data;
    }

    /**
     * 根据枚举名称获取枚举对象
     *
     * @param name 名称
     * @return 返回结果
     */
    public static GlobalErrorCode getErrorCode(String name) {
        for (GlobalErrorCode item : GlobalErrorCode.values()) {
            if (item.name().equals(name)) {
                return item;
            }
        }
        return null;
    }

    /**
     * 根据名称返回消息
     *
     * @param name 名称
     * @return 返回结果
     */
    public static String getMessage(String name) {
        for (GlobalErrorCode item : GlobalErrorCode.values()) {
            if (item.name().equals(name)) {
                return item.message();
            }
        }
        return name;
    }

    /**
     * 根据名称返回编码
     *
     * @param name 名称
     * @return 返回结果
     */
    public static Integer getCode(String name) {
        for (GlobalErrorCode item : GlobalErrorCode.values()) {
            if (item.name().equals(name)) {
                return item.code;
            }
        }
        return null;
    }

    /**
     * 根据名称返回结果
     *
     * @param name 名称
     * @return 返回结果
     */
    public static Object getData(String name) {
        for (GlobalErrorCode item : GlobalErrorCode.values()) {
            if (item.name().equals(name)) {
                return item.data;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return this.name();
    }
}
